/**
 * 枚举类
 * Enum.IMAGE.name                => "图片"
 * Enum.getNameByKey('IMAGE')     => "图片"
 * Enum.getValueByKey('IMAGE')    => 10
 * Enum.getNameByValue(10)        => "图片"
 * Enum.getData()                 => [{key: "IMAGE", name: "图片", value: 10}]
 */
class Enum {
	constructor(param) {
		const keyArr = [];
		const valueArr = [];

		if (!Array.isArray(param)) {
			throw new Error('param is not an array!');
		}

		param.map(element => {
			if (!element.key || !element.name) {
				return;
			}
			// 保存key值组成的数组，方便A.getName(name)类型的调用
			keyArr.push(element.key);
			valueArr.push(element.value);
			// 根据key生成不同属性值，以便A.B.name类型的调用
			this[element.key] = element;
			if (element.key !== element.value) {
				this[element.value] = element;
			}
		});


		// 保存源数组
		this.data = param;
		this.keyArr = keyArr;
		this.valueArr = valueArr;

		// 防止被修改
		// Object.freeze(this)
	}

	// 根据key得到对象
	keyOf(key) {
		// console.log('key: ',key);
		// console.log('this.keyArr.indexOf(key): ',this.keyArr.indexOf(key));
		// console.log('this.keyArr.data(key): ',this.data[this.keyArr.indexOf(key)]);
		return this.data[this.keyArr.indexOf(key)];
	}

	// 根据key得到对象
	valueOf(key) {
		return this.data[this.valueArr.indexOf(key)];
	}

	// 根据key获取name值
	getNameByKey(key) {
		console.log('key:--------------- ',key);
		const prop = this.keyOf(key);
		console.log('prop:--------------- ',prop);
		if (!prop) {
			throw new Error('No enum constant' + key);
		}
		return prop.name;
	}

	// 根据value获取name值
	getNameByValue(value) {
		const prop = this.valueOf(value);
		if (!prop) {
			throw new Error('No enum constant' + value);
		}
		return prop.name;
	}

	// 根据key获取value值
	getValueByKey(key) {
		const prop = this.keyOf(key);
		if (!prop) {
			throw new Error('No enum constant' + key);
		}
		return prop.value;
	}

	// 返回源数组
	getData() {
		return this.data;
	}
}

export default Enum;
